NamedParameterJdbcTemplate
Spring JDBC-র একটি ক্লাস, যা ডেটাবেসে কুয়েরি এক্সিকিউট করার সময় নামের ভিত্তিতে প্যারামিটার (Named Parameters) ব্যবহার করতে দেয়। এটি কোডের পাঠযোগ্যতা ও ম্যানেজেবিলিটি বাড়ায়, বিশেষ করে যখন অনেকগুলো প্যারামিটার ব্যবহার করা হয়।
NamedParameterJdbcTemplate
ব্যবহার করার ধাপসমূহ<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
public class DataSourceConfig {
public DataSource getDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/your_database");
dataSource.setUsername("your_username");
dataSource.setPassword("your_password");
return dataSource;
}
}
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
public class NamedParameterJdbcTemplateConfig {
private final NamedParameterJdbcTemplate namedParameterJdbcTemplate;
public NamedParameterJdbcTemplateConfig(DataSource dataSource) {
this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {
return namedParameterJdbcTemplate;
}
}
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
public class InsertExample {
public static void main(String[] args) {
DataSourceConfig dataSourceConfig = new DataSourceConfig();
NamedParameterJdbcTemplateConfig jdbcConfig = new NamedParameterJdbcTemplateConfig(dataSourceConfig.getDataSource());
NamedParameterJdbcTemplate jdbcTemplate = jdbcConfig.getNamedParameterJdbcTemplate();
String sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("name", "John Doe");
params.addValue("email", "john@example.com");
int rowsAffected = jdbcTemplate.update(sql, params);
System.out.println("Rows Inserted: " + rowsAffected);
}
}
public class UpdateExample {
public static void main(String[] args) {
DataSourceConfig dataSourceConfig = new DataSourceConfig();
NamedParameterJdbcTemplateConfig jdbcConfig = new NamedParameterJdbcTemplateConfig(dataSourceConfig.getDataSource());
NamedParameterJdbcTemplate jdbcTemplate = jdbcConfig.getNamedParameterJdbcTemplate();
String sql = "UPDATE users SET email = :email WHERE name = :name";
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("name", "John Doe");
params.addValue("email", "john.doe@example.com");
int rowsAffected = jdbcTemplate.update(sql, params);
System.out.println("Rows Updated: " + rowsAffected);
}
}
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
public class SelectExample {
public static void main(String[] args) {
DataSourceConfig dataSourceConfig = new DataSourceConfig();
NamedParameterJdbcTemplateConfig jdbcConfig = new NamedParameterJdbcTemplateConfig(dataSourceConfig.getDataSource());
NamedParameterJdbcTemplate jdbcTemplate = jdbcConfig.getNamedParameterJdbcTemplate();
String sql = "SELECT * FROM users WHERE name = :name";
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("name", "John Doe");
User user = jdbcTemplate.queryForObject(sql, params, new BeanPropertyRowMapper<>(User.class));
System.out.println("User Name: " + user.getName());
System.out.println("User Email: " + user.getEmail());
}
}
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSourceUtils;
import java.util.ArrayList;
import java.util.List;
public class BatchInsertExample {
public static void main(String[] args) {
DataSourceConfig dataSourceConfig = new DataSourceConfig();
NamedParameterJdbcTemplateConfig jdbcConfig = new NamedParameterJdbcTemplateConfig(dataSourceConfig.getDataSource());
NamedParameterJdbcTemplate jdbcTemplate = jdbcConfig.getNamedParameterJdbcTemplate();
String sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
List<User> users = new ArrayList<>();
users.add(new User("Alice", "alice@example.com"));
users.add(new User("Bob", "bob@example.com"));
SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(users.toArray());
int[] rowsAffected = jdbcTemplate.batchUpdate(sql, batch);
System.out.println("Batch Inserted Rows: " + rowsAffected.length);
}
}
MapSqlParameterSource
:SqlParameterSourceUtils
:NamedParameterJdbcTemplate
:Feature | JdbcTemplate | NamedParameterJdbcTemplate |
---|---|---|
Parameter Style | Indexed Parameters (? ) | Named Parameters (:paramName ) |
Readability | কম (Parameter index দেখতে হয়) | বেশি (Parameter name দেখে বোঝা যায়) |
Complex Objects | Bean বা Map সমর্থন করে না | Bean বা Map সহজেই সমর্থন করে |
Batch Processing | BatchArguments প্রয়োজন | SqlParameterSourceUtils সহজে সমর্থন করে |
উপসংহার:
NamedParameterJdbcTemplate Spring JDBC-এর একটি শক্তিশালী টুল যা সহজে ব্যবহারযোগ্য এবং কোডের মেইনটেইনেবিলিটি বাড়ায়। জটিল কুয়েরি এবং ব্যাচ প্রসেসিংয়ের জন্য এটি JdbcTemplate এর চেয়ে উন্নত বিকল্প।
NamedParameterJdbcTemplate স্প্রিং জেডিবিসি (Spring JDBC) এর একটি গুরুত্বপূর্ণ ক্লাস, যা SQL কুয়েরিতে নামকৃত প্যারামিটার ব্যবহার করার সুবিধা প্রদান করে। এটি সাধারণ JdbcTemplate
এর উন্নত সংস্করণ, যেখানে প্যারামিটারাইজড কুয়েরি তৈরির সময় নামকৃত প্যারামিটার (Named Parameters) ব্যবহার করা যায়, যা কোডকে আরও পাঠযোগ্য, সহজ এবং ভুলমুক্ত করে তোলে।
NamedParameterJdbcTemplate
একটি ক্লাস যা স্প্রিং জেডিবিসি ফ্রেমওয়ার্কের অংশ। এটি JdbcTemplate
এর মত কাজ করে, তবে এটি SQL কুয়েরি এক্সিকিউট করার সময় প্যারামিটারাইজড কুয়েরিতে নামকৃত প্যারামিটার ব্যবহার করার সুযোগ দেয়। এর মাধ্যমে SQL কুয়েরি লেখার সময় প্যারামিটারগুলি নাম দ্বারা চিহ্নিত করা হয়, যেমন :param1
, :param2
, ইত্যাদি।
?
চিহ্ন দ্বারা স্থাপন করা হয়, কিন্তু নামকৃত প্যারামিটার ব্যবহার করলে প্রতিটি প্যারামিটার কী কাজ করছে তা সহজে বোঝা যায়।?
প্যারামিটারগুলো সঠিকভাবে ব্যবহার করা কঠিন হতে পারে। নামকৃত প্যারামিটার ব্যবহার করলে প্যারামিটারগুলোর অবস্থান ও অর্থ স্পষ্ট হয়ে ওঠে, ফলে ভুল হওয়ার সম্ভাবনা কমে।ধরা যাক, আমাদের একটি Employee
টেবিল থেকে কিছু ডেটা পড়তে হবে যেখানে id
এবং name
প্যারামিটার হিসেবে ব্যবহার করা হবে।
প্রথমে, NamedParameterJdbcTemplate
এবং ডেটাবেস সংযোগ সেটআপ করা প্রয়োজন।
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
public class DataSourceConfig {
public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
DataSource dataSource = dataSource();
return new NamedParameterJdbcTemplate(dataSource);
}
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
dataSource.setUsername("root");
dataSource.setPassword("password");
return dataSource;
}
}
এখন, NamedParameterJdbcTemplate
ব্যবহার করে SQL কুয়েরি এক্সিকিউট করা হবে।
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import java.util.List;
import java.util.Map;
public class EmployeeDao {
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
public void setNamedParameterJdbcTemplate(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
}
public List<Employee> getEmployeesByIdAndName(int id, String name) {
String sql = "SELECT * FROM Employee WHERE id = :id AND name = :name";
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("id", id);
parameters.addValue("name", name);
return namedParameterJdbcTemplate.query(sql, parameters, new EmployeeRowMapper());
}
}
এখানে EmployeeRowMapper
হল একটি কাস্টম ক্লাস যা RowMapper
ইন্টারফেস ইমপ্লিমেন্ট করে, যেটি SQL কুয়েরি থেকে প্রাপ্ত রেকর্ডকে Employee
অবজেক্টে ম্যাপ করবে।
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public class EmployeeRowMapper implements RowMapper<Employee> {
@Override
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee employee = new Employee();
employee.setId(rs.getInt("id"));
employee.setName(rs.getString("name"));
// আরও প্রপার্টি সেট করুন
return employee;
}
}
?
ব্যবহার না করে নামকৃত প্যারামিটার যেমন :id
, :name
ব্যবহার করতে পারা যায়, যা কোডের পাঠযোগ্যতা বাড়ায়।NamedParameterJdbcTemplate স্প্রিং জেডিবিসির একটি শক্তিশালী ক্লাস যা SQL কুয়েরিতে নামকৃত প্যারামিটার ব্যবহারের সুবিধা প্রদান করে। এটি কোডের পাঠযোগ্যতা এবং ডাইনামিক SQL কুয়েরি নির্মাণে সহায়ক। যখন SQL কুয়েরিতে অনেক প্যারামিটার থাকে, তখন এটি ব্যবহারের মাধ্যমে কোড সহজ এবং ভুলমুক্ত করা যায়।
Spring JDBC-এ Named Parameters এবং SqlParameterSource ব্যবহার করা হয় SQL কোয়েরি বা আপডেট অপারেশনে প্যারামিটার পাঠানোর জন্য। এটি প্যারামিটারাইজড কোয়েরির ব্যবহারে অনেক সুবিধা প্রদান করে এবং কোডকে আরও পরিষ্কার, পাঠযোগ্য এবং নিরাপদ করে তোলে।
Named Parameters হল SQL কোয়েরির মধ্যে প্যারামিটারকে নাম দিয়ে উল্লেখ করার পদ্ধতি। সাধারণত, JDBC এ প্যারামিটার বসানোর জন্য ?
ব্যবহার করা হয়, কিন্তু Named Parameters ব্যবহার করলে প্যারামিটারগুলোকে নাম দিয়ে উল্লেখ করা যায়, যা কোডের পাঠযোগ্যতা বৃদ্ধি করে এবং SQL ইনজেকশনের ঝুঁকি কমায়।
Spring JDBC-এ NamedParameterJdbcTemplate
ব্যবহার করা হয় Named Parameters এর সাথে কাজ করতে।
SqlParameterSource
একটি ইন্টারফেস যা প্যারামিটার মানগুলি সরবরাহ করে। NamedParameterJdbcTemplate
ক্লাস এই ইন্টারফেসটি ব্যবহার করে নামকৃত প্যারামিটারগুলোর মানগুলিকে ম্যানেজ করে।
Spring JDBC-এ NamedParameterJdbcTemplate এবং SqlParameterSource ব্যবহার করার উদাহরণ নিচে দেখানো হলো।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class UserRepository {
@Autowired
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
// Method to get users by age range using named parameters
public List<User> getUsersByAgeRange(int minAge, int maxAge) {
String sql = "SELECT * FROM users WHERE age BETWEEN :minAge AND :maxAge";
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("minAge", minAge);
parameters.addValue("maxAge", maxAge);
return namedParameterJdbcTemplate.query(sql, parameters, new UserRowMapper());
}
}
এখানে:
:minAge
এবং :maxAge
নামে প্যারামিটার ব্যবহার করা হয়েছে।MapSqlParameterSource
ব্যবহার করে প্যারামিটারগুলোর মান (যেমন minAge
এবং maxAge
) সেট করা হয়েছে।NamedParameterJdbcTemplate
ব্যবহার করে কোয়েরি চালানো হয়েছে, যা নামকৃত প্যারামিটারগুলি সমর্থন করে।import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.stereotype.Repository;
@Repository
public class UserRepository {
@Autowired
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
// Method to update user details using named parameters
public int updateUser(int userId, String userName, String email) {
String sql = "UPDATE users SET user_name = :userName, email = :email WHERE user_id = :userId";
SqlParameterSource parameters = new MapSqlParameterSource()
.addValue("userId", userId)
.addValue("userName", userName)
.addValue("email", email);
return namedParameterJdbcTemplate.update(sql, parameters);
}
}
এখানে:
:userId
, :userName
, এবং :email
নামে প্যারামিটার ব্যবহার করা হয়েছে।MapSqlParameterSource
এর মাধ্যমে SQL প্যারামিটারগুলো সেট করা হয়েছে।namedParameterJdbcTemplate.update()
মেথডটি ব্যবহার করে SQL কোয়েরি আপডেট করা হয়েছে।JdbcTemplate
এর মতো কাজ করে, তবে এটি প্যারামিটারগুলির নাম ব্যবহার করে SQL কোয়েরি বা আপডেট অপারেশন পরিচালনা করতে সহায়তা করে।SqlParameterSource
ইন্টারফেসের একটি ইমপ্লিমেন্টেশন। এটি প্যারামিটার নাম এবং তাদের মান সংরক্ষণ করতে ব্যবহৃত হয়।addValue()
মেথডের মাধ্যমে প্যারামিটার যোগ করতে সহায়তা করে, যেখানে প্যারামিটার নাম এবং মান নির্ধারণ করা হয়।MapSqlParameterSource
) প্যারামিটারগুলোর মান রাখার জন্য একটি ইন্টারফেস প্রদান করে এবং NamedParameterJdbcTemplate
এর সাথে খুব সহজে ইন্টিগ্রেট করা যায়।এভাবে Spring JDBC-এ Named Parameters এবং SqlParameterSource ব্যবহার করা কোডকে আরো মেনটেনেবল এবং নিরাপদ করে তোলে।
Spring JDBC-এ NamedParameterJdbcTemplate
একটি বিশেষ ধরনের JdbcTemplate
যা SQL কোয়েরি লেখার সময় নামকৃত প্যারামিটার ব্যবহার করতে সহায়ক। এটি কোডটি আরও পাঠযোগ্য এবং রক্ষণাবেক্ষণযোগ্য করে তোলে, কারণ SQL স্টেটমেন্টে প্যারামিটারগুলি নাম দিয়ে উল্লেখ করা হয়, না যে তাদের অবস্থান (position) দিয়ে।
NamedParameterJdbcTemplate
ব্যবহার করার জন্য SQL কোয়েরিতে নামকৃত প্যারামিটার ব্যবহার করতে হবে এবং সেই প্যারামিটারগুলির মান Map
বা SqlParameterSource
এর মাধ্যমে সরবরাহ করতে হবে।
ধরা যাক, আমাদের একটি Employee টেবিল রয়েছে যার মধ্যে id, name, এবং salary ফিল্ড রয়েছে। আমাদের একটি SQL কোয়েরি ব্যবহার করে NamedParameterJdbcTemplate
এর মাধ্যমে ডেটাবেসে ডেটা ইনসার্ট এবং সিলেক্ট করার উদাহরণ নিচে দেখানো হলো।
প্রথমে, আপনাকে Spring JDBC এবং Spring Context ডিপেনডেন্সি আপনার pom.xml
ফাইলে যুক্ত করতে হবে (যদি না থাকে)।
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.24</version> <!-- সর্বশেষ সংস্করণ নিশ্চিত করতে Maven Repository থেকে চেক করুন -->
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.24</version>
</dependency>
প্রথমে DataSource
কনফিগারেশন করতে হবে। এই উদাহরণে, আমরা HikariCP ব্যবহার করছি, তবে আপনি Tomcat Connection Pool বা অন্য কোন পুল ব্যবহার করতে পারেন।
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/your_database");
hikariConfig.setUsername("your_username");
hikariConfig.setPassword("your_password");
hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
return new HikariDataSource(hikariConfig);
}
}
NamedParameterJdbcTemplate
ক্লাসকে একটি JdbcTemplate
এর বিকল্প হিসেবে ব্যবহার করা হয়। এতে SQL কোয়েরিতে প্যারামিটারগুলি নামের মাধ্যমে উল্লেখ করা হয়।
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class EmployeeDAO {
private final NamedParameterJdbcTemplate jdbcTemplate;
@Autowired
public EmployeeDAO(DataSource dataSource) {
this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
// Employee ইনসার্ট করার জন্য
public void addEmployee(int id, String name, double salary) {
String sql = "INSERT INTO Employee (id, name, salary) VALUES (:id, :name, :salary)";
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("id", id);
parameters.addValue("name", name);
parameters.addValue("salary", salary);
jdbcTemplate.update(sql, parameters);
}
// সমস্ত Employee পড়ার জন্য
public List<Employee> getAllEmployees() {
String sql = "SELECT * FROM Employee";
return jdbcTemplate.query(sql, new EmployeeRowMapper());
}
}
NamedParameterJdbcTemplate
এর মাধ্যমে সিলেক্ট কোয়েরি চালানোর সময় আমরা RowMapper
ব্যবহার করে রেজাল্ট সেটকে Employee
অবজেক্টে রূপান্তর করি।
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public class EmployeeRowMapper implements RowMapper<Employee> {
@Override
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee employee = new Employee();
employee.setId(rs.getInt("id"));
employee.setName(rs.getString("name"));
employee.setSalary(rs.getDouble("salary"));
return employee;
}
}
এখন, Employee
ক্লাসটি তৈরি করি, যেখানে id
, name
, এবং salary
ফিল্ড থাকবে।
public class Employee {
private int id;
private String name;
private double salary;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
:id
, :name
, এবং :salary
এর মতো হবে।MapSqlParameterSource
ব্যবহার করে এই নামকৃত প্যারামিটারগুলির মান পাস করা হয়।MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("id", id);
parameters.addValue("name", name);
parameters.addValue("salary", salary);
এখন আপনি EmployeeDAO
ক্লাসটি ব্যবহার করে ডেটাবেসে ডেটা ইনসার্ট এবং সিলেক্ট করতে পারবেন।
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
// Spring কনটেক্সট ইনিশিয়ালাইজ করা
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DataSourceConfig.class);
EmployeeDAO employeeDAO = context.getBean(EmployeeDAO.class);
// নতুন Employee ইনসার্ট করা
employeeDAO.addEmployee(1, "John Doe", 50000);
// সমস্ত Employee পড়া
List<Employee> employees = employeeDAO.getAllEmployees();
employees.forEach(employee -> System.out.println(employee.getName()));
context.close();
}
}
এই উদাহরণটি দেখিয়েছে কিভাবে Spring JDBC তে NamedParameterJdbcTemplate
ব্যবহার করে প্যারামিটারাইজড SQL কোয়েরি পরিচালনা করা যায়।
Read more